package com.terry.test3;

import java.util.*;
import java.util.stream.Collectors;

/**
 * 服务失效判断
 *
 * 类似并查集构建
 *
 * 有这么一个系统，里面有很多服务， 每个服务用字符串来唯一标识的，字符串仅包含 字母和数字，长度不超过10 。 服务之间可能有依赖关系， 如 A 依赖B ， 所以当B故障时， A也故障。
 *
 * 依赖由有传递性，如 A--> B , B--> C , 则 C故障时，A B 全故障。
 *
 * 题目会给出所有的依赖关系，和故障的节点，让你求出正常的服务有哪些。
 *
 * 不必考虑输入异常，用例保证：依赖关系列表、故障列表非空，且依赖关系数，故障服务数都不会超过3000，服务标识格式正常。
 *
 *
 * 下面那部分需要付费解锁的，我用了一些技术手段高出来了，是对输入的描述。
 *
 * 告诉你输入是 x-y 这种格式，用逗号分隔。
 *
 * 输出是 按照依赖关系出现的次序排序的正常的服务，逗号分隔，如果没有正常的， 则输出一个逗号。
 *
 * 例1：输入
 *
 * a1-a2,a5-a6,a2-a3
 * a5,a2
 *
 * 输入是两行，第一行是告诉你有哪些依赖关系，a1依赖a2，a5依赖a6，a2依赖a3。
 *
 * 第二行告诉你哪几个节点故障了，即 a5 和 a2 故障了。
 *
 * a2故障，导致a1不可用，但不影响a3；a5故障不影响a6。所以可用的是a3、a6，在依赖关系列表中a6先出现，所以输出:a6,a3
 *
 *
 * 例2：输入
 *
 * a1-a2
 * a2
 *
 * 输出：
 *
 * ,
 *
 * 输出是一个逗号。a1依赖a2，a2故障导致a1也故障，没有正常节点，输出一个逗号。
 *
 * @author 小八
 * @date 2023年02月09日15:16
 */
public class Title10 {

    public static void main(String[] args) {
      Scanner in = new Scanner(System.in);
      while(in.hasNextLine()){
          Map<String,List> linkMap = new HashMap<>();
          Map<String,Integer> countMap = new HashMap<>();
          List<String> resultList = new ArrayList<>();
          String[] split = in.nextLine().split(",");
          String[] searchs = in.nextLine().split(",");
          for(int i=0;i<split.length;i++) {
              String[] des = split[i].split("-");
              if (linkMap.containsKey(des[1])) {
                  List<String> list = linkMap.get(des[1]);
                  list.add(des[0]);
              } else {
                  List<String> list = new ArrayList<>();
                  list.add(des[0]);
                  //split[0] 依赖 split[1]
                  linkMap.put(des[1], list);
              }
              if(!countMap.containsKey(des[0])){
                  countMap.put(des[0],1);
                  resultList.add(des[0]);
              }
              if(!countMap.containsKey(des[1])){
                  countMap.put(des[1],1);
                  resultList.add(des[1]);
              }
          }
          for(int i=0;i<searchs.length;i++){
              countMap.put(searchs[i],0);
              calcRelate(countMap,linkMap,searchs[i]);
          }
          String resultStr = resultList.stream().filter(obj -> countMap.get(obj) == 1).collect(Collectors.joining(","));
          if(resultStr.isEmpty()){
              System.out.println(",");
          }else{
              System.out.println(resultStr);
          }
      }
    }

    public static void calcRelate(Map<String,Integer> countMap ,Map<String,List> linkMap,String searchStr){
        if(linkMap.containsKey(searchStr)){
            List<String> linkList = linkMap.get(searchStr);
            linkList.forEach(obj->{
                calcRelate(countMap,linkMap,obj);
            });
        }else{
            countMap.put(searchStr,0);
        }
    }

}
